package com.yang.controller;

import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yang.exception.BusinessException;
import com.yang.pojo.UserInfo;
import com.yang.service.UserInfoService;
import com.yang.util.JsonResult;
import org.apache.poi.hssf.usermodel.*;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import sun.security.krb5.internal.Ticket;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * @Author 杨天可
 * @Date 2021/3/12 14:57
 * @Version 1.0
 */
@Transactional
@RestController
@RequestMapping("/network")
public class NetworkController {

    @Resource
    UserInfoService userInfoService;
    @Resource
    RedisTemplate<String,Object> redisTemplate;

    /***
     * 短信验证
     * @param phone
     * @return
     * @throws IOException
     */
    @RequestMapping("/send")
    public Map send(@RequestParam(value = "phone",required = false) String phone) throws IOException {
        //该手机号是否已注册用户
        JsonResult jsonResult = new JsonResult();
        UserInfo byPhone = userInfoService.findByPhone(phone);
        //如果已注册，提示用户已注册、更换手机号或者直接登陆
        if (byPhone != null ){
            throw new BusinessException("该手机号已注册，请更换手机号或者直接登陆");
        } else {
            //如果没注册，可以注册，需要调用阿里云短信接口，实现发送
            DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "LTAI4G3ppx88ZCeZck1N2Z24", "TPfCzao1FUL2x1hnBIpcDTmgxf5sTq");
            IAcsClient client = new DefaultAcsClient(profile);

            CommonRequest request = new CommonRequest();
            request.setSysMethod(MethodType.POST);
            request.setSysDomain("dysmsapi.aliyuncs.com");
            request.setSysVersion("2017-05-25");
            request.setSysAction("SendSms");
            request.putQueryParameter("RegionId", "cn-hangzhou");
            request.putQueryParameter("PhoneNumbers", phone);
            request.putQueryParameter("SignName", "天堃商城");
            request.putQueryParameter("TemplateCode", "SMS_204976112");

            //生成4位随机数验证码(1-9)
            String code="";
            for (int i=0;i<4;i++){
                code+=(int)(Math.random()*9+1);
            }
            // 给阿里云短信模板中的${code}赋值，json格式
            request.putQueryParameter("TemplateParam", "{'code':"+code+"}");
            try {
                CommonResponse response = client.getCommonResponse(request);
                // 获取的验证码数据,
                String data = response.getData();
                //{"Message":"OK","RequestId":"CBC83055-A113-483A-91B2-0E4C56CCC643","BizId":"790710603115763709^0","Code":"OK"}

                ObjectMapper mapper = new ObjectMapper();
                Map<String, Object> tmpMap=mapper.readValue(data, Map.class);
                if("OK".equals(tmpMap.get("Code"))){
                    jsonResult.setCode("1");
                    jsonResult.setMsg("验证码发送成功");

                    // 将数据保存在redis服务器上
                    ValueOperations<String,Object> operations = redisTemplate.opsForValue();
                    // 设置生存时间, 15分钟有效
                    operations.set(phone,code,15, TimeUnit.MINUTES);

                }else{
                    jsonResult.setCode("0");
                    jsonResult.setMsg("验证码发送失败,请检查手机号或稍后再试");
                }


            } catch (ServerException e) {
                e.printStackTrace();
            } catch (ClientException e) {
                e.printStackTrace();
            } catch (JsonMappingException e) {
                e.printStackTrace();
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        }

        return jsonResult.getValues();
    }


    /***
     * 上传图片
     * @param multipartFile
     * @param request
     * @return
     * @throws IOException
     */
    //HttpServletRequest为了获取Context,从而获取"/"真实路径
    @PostMapping(value = "/upload")
    public Map<String, Object> upload(@RequestParam("file") MultipartFile multipartFile, HttpServletRequest request) throws IOException {
        JsonResult jsonResult = new JsonResult();
        //不能上传空文件
        if(multipartFile.isEmpty()){
            throw new BusinessException("文件不能为空");
        }

        // 首先先用getSize()获取文件大小
        // 首先先将.getSize()获取的Long转为String 然后将String转为Float并除以1024 （因为1KB=1024B）
        Float size = Float.parseFloat(String.valueOf(multipartFile.getSize())) / 1024;

        System.out.println("图片的大小为："+size);
        BigDecimal b = new BigDecimal(size);
        // 2表示2位 ROUND_HALF_UP表明四舍五入，
        size = b.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue();
        // 此时size就是保留两位小数的浮点数
//        long size = multipartFile.getSize();
        if(size > 1048576){
            throw  new BusinessException("图片大小不能超过1M");
        }

        String originalFilename = multipartFile.getOriginalFilename();
        System.out.println("originalFilename:" + originalFilename);

        /*
        从原始文件名中获取后缀，后缀必须是 png /jpg /jpeg /gif
        作为新添加的文件的文件名后缀(匹配)
         */
        String subfix = originalFilename.substring(originalFilename.indexOf(".") + 1);
        System.out.println("subfix:" + subfix); //输出文件后缀
        if(!(subfix.equals("png")|| subfix.equals("jpg")|| subfix.equals("jpeg")|| subfix.equals("gif"))){
            throw new BusinessException("只能上传png，jpg，jpeg，gif格式的图片");
        }

        //在springboot中，然后把上传的文件保存在指定的位置

        //在目标文件中与真实路径中做一个映射

        //使用UUID作为文件名,保证服务器中存放的文件名唯一
        String targetFile = UUID.randomUUID().toString().replace("-", "") + "." + subfix;
        System.out.println("targetFile:" + targetFile); //输出目标文件名
        // 通过request获取当前程序的根路径"/"
//        String path = request.getServletContext().getRealPath("/");

        //上传windows本地文件夹
        String fileName ="D:\\img\\" + targetFile;

        System.out.println("fileName:" + fileName);  //输出文件完整地址

        // 构建文件对象
        File uploadFile = new File(fileName);
        //核心操作(含有异常操作, 利用异常设定状态码(和前端约定)
        // 此处应当和ExceptionController结合, 当try执行成功则设定状态码0
        // 出现异常则设定其他
        // 再将异常信息结合BusinessException抛出, 交给ExceptionController处理
        try {
            multipartFile.transferTo(uploadFile);


            // 返回状态:0 表示上传成功
            jsonResult.setCode("200");
            // 返回服务器保存后的文件名
            jsonResult.put("fileName", targetFile);
            jsonResult.setData(fileName);
        } catch (IOException e) {
            throw e;
        }
        return jsonResult.getValues();
    }

    //上传到Linux 服务器
//        String fileName ="/usr/upload/img/" + targetFile;
//        System.out.println("fileName:" + fileName);  //输出文件完整地址
//
//    // 构建文件对象
//    File uploadFile = new File(fileName);
//    //核心操作(含有异常操作, 利用异常设定状态码(和前端约定)
//    // 此处应当和ExceptionController结合, 当try执行成功则设定状态码0
//    // 出现异常则设定其他
//    // 再将异常信息结合BusinessException抛出, 交给ExceptionController处理
//        try {
//        multipartFile.transferTo(uploadFile);
//    } catch (IOException e) {
//        //e.printStackTrace();
//        throw e;
//    }
//
//    JsonResult jsonResult = new JsonResult();
//
//        String newFilename = "/img/"+targetFile;
//    // 返回状态:0 表示上传成功
//        jsonResult.setCode("200");
//    // 返回服务器保存后的文件名
//        jsonResult.put("fileName", newFilename);
//        return jsonResult.getValues();
//}


    /***
     * 导出员工信息
     * @param response
     * @throws IOException
     */
//    @RequestMapping("/exportTktList")
//    public void handle(HttpServletResponse response) throws IOException {
//
//        //准备将时间格式处理为标准日期格式
//        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        // 先获取数据
//        List<Ticket> tickets =  ticketMapper.selectAll();
//
//        // POI 实现
//        HSSFWorkbook workbook = new HSSFWorkbook();
//        HSSFSheet sheet = workbook.createSheet("ticket");  // 工作表的名称
//        String fileName = "优惠券列表.xls";   // 文件名
//        // 完美实现中文文件名的转换
//        fileName = URLEncoder.encode(fileName,"utf-8").replaceAll("\\+", "%20");
//        // headers表示excel表中第一行的表头 在excel表中添加表头
//        String[] headers = { "编号", "名称", "描述","使用规则","领取时间","使用时间","领取状态","地址"};
//        HSSFRow row = sheet.createRow(0);
//        for(int i=0;i<headers.length;i++){
//            HSSFCell cell = row.createCell(i);
//            HSSFRichTextString text = new HSSFRichTextString(headers[i]);
//            cell.setCellValue(text);
//        }
//
//        // 添加数据行:
//        int rowNum = 1;
//        for (Ticket item : tickets) {
//            HSSFRow dataRow = sheet.createRow(rowNum);
//            dataRow.createCell(0).setCellValue(rowNum);   // 自增长变量
//            dataRow.createCell(1).setCellValue(item.getName());
//            dataRow.createCell(2).setCellValue(item.getDesc());
//            dataRow.createCell(3).setCellValue(item.getRole());
//            dataRow.createCell(4).setCellValue(dateFormat.format(item.getCollectExpired()));
//            dataRow.createCell(5).setCellValue(dateFormat.format(item.getUseExpired()));
//            dataRow.createCell(6).setCellValue(item.getState());
//            dataRow.createCell(7).setCellValue(item.getImg());
//            rowNum++;
//        }
//
//        //返回给前端下载
//        response.setContentType("application/octet-stream");
//        // 以附件形式访问
//        response.setHeader("Content-disposition", "attachment;filename=" + fileName);
//        response.flushBuffer();
//        workbook.write(response.getOutputStream());
//    }
}
